//g++ Melangeur.cpp -o melangeur


#include <time.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <fstream>
#include <string>

#include "all2.h"

#define NB_INSTANCES 5

using namespace std;


int taille;
int nbColor;
vector <Piece>  listePieces;

vector <Piece>  listePieces2;


void parserPuzzle(const char * nomFichier)
{



        ifstream Puzzle(nomFichier, ios::in);  // on ouvre le fichier en lecture
        string ligne="";
        int i =0;
        getline(Puzzle, ligne);
     //   cout<<"ligne 1 : "<<ligne<<endl;
        int compteur=0;
        string temp="";
        while (i<ligne.size()) {

                if (ligne[i]==' ') {
                        i++;
                } else if (compteur==0) {
                        while (ligne[i]!=' ') {
                                temp+=ligne[i];
                                i++;
                        }
                        taille=atoi(temp.c_str());
                        temp="";
                        i++;
                        compteur++;
                } else if (compteur==1) {
                        compteur++;
                        i++;
                } else if (compteur==2) {
                        while (ligne[i]!=' ') {
                                temp+=ligne[i];
                                i++;
                        }
                        nbColor=atoi(temp.c_str());
                        temp="";
                        i++;
                        compteur++;
                }
        }
        bool valide;
        int cpt=1;
        ligne="";
        while (getline(Puzzle,ligne)) {
               // cout<<"parsage de la ligne: "<<ligne<<"de taille: "<<ligne.size()<<endl<<endl;
                i=0;
                valide = false;
                compteur=0;
                Piece p;

                while (i<ligne.size()) {
                        cout<<i<<" : "<<compteur<<" : "<<ligne[i]<<endl;
                        if ((ligne[i]==' ')||(ligne[i]==',')) {

                        }
                        //haut droit bas gauche
                        else {
                                while (i < ligne.size() && ligne[i]!=' ') {
                                        temp+=ligne[i];
                                        i++;
                                }
                            //    cout<<"temp : "<<temp<<endl;
                                if (compteur==0) {
                                        p.haut=atoi(temp.c_str());
                                        temp="";
                                        compteur++;
                                  //      cout<<"haut: "<<(int)p.haut<<endl;
                                } else if (compteur==1) {
                                        p.droit=atoi(temp.c_str());
                                        temp="";
                                        compteur++;
                                   //     cout<<"droit: "<<(int)p.droit<<endl;
                                }

                                else if (compteur==2) {
                                        p.bas=atoi(temp.c_str());
                                        temp="";
                                        compteur++;
                                   //     cout<<"bas: "<<(int)p.bas<<endl;
                                }

                                else if (compteur==3) {
                                        valide = true;
                                //        cout<<" on valide"<<endl;
                                        p.gauche=atoi(temp.c_str());
                                        temp="";
                                        compteur++;
                                 //       cout<<"gauche: "<<(int)p.gauche<<endl;
                                }
                        }
                        i++;
                //        cout<<"caractere parsé!"<<valide<<endl;
                }

                if (valide) {
                        p.numero=cpt;
                        p.estPose=false;
                        cpt++;
                  //      cout<<" et on push_back"<<endl;
                        listePieces.push_back(p);
                }
                ligne="";
        }
        cout<<"fin du parsage"<<endl;
}




int main(int argc, char **argv)
{

        srand ( time(NULL) );


        parserPuzzle(argv[1]);

int nbInst;

if (argc>1) {nbInst = atoi(argv[2]);} else {nbInst = NB_INSTANCES;}

        for (int i = 0; i< nbInst; i++) {

                string nom = argv[1];
                nom+=i+65;
                nom+=".txt";
                cout<<nom.c_str()<<endl;
                ofstream Instance(nom.c_str() , ios::out | ios::trunc);  //déclaration du flux et ouverture du fichier

                //shuffle

                listePieces2.clear();

                Piece pieceVide;
                pieceVide.numero=0;

                listePieces2.resize(listePieces.size(),pieceVide);

                for (int j = 0; j < listePieces.size(); j++) {
                        int alea = rand() % listePieces.size();
                        int cpt = alea;
                        bool bouclage = false;
                        while ( listePieces2[cpt].numero) {
                                cpt++;
                                if (cpt == listePieces2.size()) {
                                        //bouclage = true;
                                        cpt=0;
                                }

                        }

                        listePieces2[cpt]=listePieces[j];


                }

			Instance<<taille<<" "<<taille<<" "<<nbColor<<endl<<endl;
			cout<<taille<<" "<<taille<<" "<<nbColor<<endl<<endl;

			for(int k = 0 ; k < listePieces2.size(); k++){
			cout<<(int)listePieces2[k].haut<<" "<<(int)listePieces2[k].droit<<" "<<(int)listePieces2[k].bas<<" "<<(int)listePieces2[k].gauche<<endl<<endl;
				Instance<<(int)listePieces2[k].haut<<" "<<(int)listePieces2[k].droit<<" "<<(int)listePieces2[k].bas<<" "<<(int)listePieces2[k].gauche<<endl<<endl;

				}


                Instance.close();

        }
}

